{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "provenance": [],
      "toc_visible": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "id": "pULeWpb_V1an"
      },
      "outputs": [],
      "source": [
        "import numpy as np\n",
        "import matplotlib.pyplot as plt"
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "import jax\n",
        "import jax.numpy as jnp"
      ],
      "metadata": {
        "id": "zeEW8C9oWLoe"
      },
      "execution_count": 2,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "jax.__version__"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 35
        },
        "id": "11gg-e1GraWL",
        "outputId": "677adad3-1c25-466b-d031-278c7457a005"
      },
      "execution_count": 3,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "'0.4.16'"
            ],
            "application/vnd.google.colaboratory.intrinsic+json": {
              "type": "string"
            }
          },
          "metadata": {},
          "execution_count": 3
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## When differentiating with respect to the first parameter is not enough"
      ],
      "metadata": {
        "id": "xxfy0vIEwUhs"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def dist(order, x, y):\n",
        "  return jnp.power(jnp.sum(jnp.abs(x-y)**order), 1.0/order)"
      ],
      "metadata": {
        "id": "UxLj0c5OwVm2"
      },
      "execution_count": 4,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "dist_d_x = jax.grad(dist, argnums=1)"
      ],
      "metadata": {
        "id": "yntT1Gucw5Uk"
      },
      "execution_count": 5,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "dist_d_xy = jax.grad(dist, argnums=(1,2))"
      ],
      "metadata": {
        "id": "jKBZ-qW_w7Av"
      },
      "execution_count": 6,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "dist_d_x(1, jnp.array([1.0,1.0,1.0]), jnp.array([2.0,2.0,2.0]))\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "h5kM5DmsylXF",
        "outputId": "b8593862-8dd8-4f09-87d0-a057819428e6"
      },
      "execution_count": 7,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stderr",
          "text": [
            "WARNING:jax._src.xla_bridge:No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)\n"
          ]
        },
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Array([-1., -1., -1.], dtype=float32)"
            ]
          },
          "metadata": {},
          "execution_count": 7
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "dist_d_xy(1, jnp.array([1.0,1.0,1.0]), jnp.array([2.0,2.0,2.0]))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "FgERWvLHwisd",
        "outputId": "4cfa5025-2100-4555-c22f-ece65fe43ae8"
      },
      "execution_count": 8,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(Array([-1., -1., -1.], dtype=float32), Array([1., 1., 1.], dtype=float32))"
            ]
          },
          "metadata": {},
          "execution_count": 8
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Differentiating with respect to multiple parameters"
      ],
      "metadata": {
        "id": "D0jIp_Zd6QyT"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "x = np.linspace(0, 10*np.pi, num=1000)\n",
        "e = np.random.normal(scale=10.0, size=x.size)\n",
        "y = 65.0 + 1.8*x + 40*np.cos(x) + e\n",
        "\n",
        "xt = jnp.array(x)\n",
        "yt = jnp.array(y)\n",
        "learning_rate = 1e-2"
      ],
      "metadata": {
        "id": "bxbZpTxyDXIr"
      },
      "execution_count": 9,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "model_parameters = {\n",
        "    'w': jnp.array([1.]),\n",
        "    'b': jnp.array([1.])\n",
        "    }\n",
        "\n",
        "def model(param_dict, x):\n",
        "    w, b = param_dict['w'], param_dict['b']\n",
        "    return w * x + b\n",
        "\n",
        "def loss_fn(model_parameters, x, y):\n",
        "    prediction = model(model_parameters, x)\n",
        "    return jnp.mean((prediction-y)**2)\n",
        "\n",
        "grads_fn = jax.grad(loss_fn)\n",
        "grads = grads_fn(model_parameters, xt, yt)\n"
      ],
      "metadata": {
        "id": "tjj3o9UcwkRO"
      },
      "execution_count": 10,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(grads)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "8gZLSxf56ygP",
        "outputId": "ef556ba6-4aea-4465-9494-2f78fa5cd05c"
      },
      "execution_count": 11,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "{'b': Array([-153.29868], dtype=float32), 'w': Array([-2533.0576], dtype=float32)}\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Returning auxiliary data from a function"
      ],
      "metadata": {
        "id": "fd81jpFs9tNe"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "model_parameters = jnp.array([1., 1.])\n",
        "\n",
        "def model(theta, x):\n",
        "    w, b = theta\n",
        "    return w * x + b\n",
        "\n",
        "def loss_fn(model_parameters, x, y):\n",
        "    prediction = model(model_parameters, x)\n",
        "    return jnp.mean((prediction-y)**2), prediction\n",
        "\n",
        "grads_fn = jax.grad(loss_fn, has_aux=True)\n",
        "grads, preds  = grads_fn(model_parameters, xt, yt)\n",
        "model_parameters -= learning_rate * grads\n"
      ],
      "metadata": {
        "id": "Yy5ReYiV7Dr4"
      },
      "execution_count": 12,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "model_parameters"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "OKRqjmrG94rq",
        "outputId": "f912f88d-1451-4db0-cd20-578b50252b4b"
      },
      "execution_count": 13,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Array([26.330576 ,  2.5329866], dtype=float32)"
            ]
          },
          "metadata": {},
          "execution_count": 13
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "grads"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "e2h3GXHJ-Fcj",
        "outputId": "fae3346a-1eb7-4b7e-b9ea-3868355690ec"
      },
      "execution_count": 14,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Array([-2533.0576 ,  -153.29868], dtype=float32)"
            ]
          },
          "metadata": {},
          "execution_count": 14
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "preds.shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "rm5xjXXL-G_R",
        "outputId": "c9878128-3d95-4106-9bbb-134923b9f7ca"
      },
      "execution_count": 15,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(1000,)"
            ]
          },
          "metadata": {},
          "execution_count": 15
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Obtaining both gradient and value of the function"
      ],
      "metadata": {
        "id": "vdTzrN1p_Uyb"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "model_parameters = jnp.array([1., 1.])\n",
        "\n",
        "def model(theta, x):\n",
        "    w, b = theta\n",
        "    return w * x + b\n",
        "\n",
        "def loss_fn(model_parameters, x, y):\n",
        "    prediction = model(model_parameters, x)\n",
        "    return jnp.mean((prediction-y)**2), prediction\n",
        "\n",
        "grads_fn = jax.value_and_grad(loss_fn, has_aux=True)\n",
        "(loss, preds), grads  = grads_fn(model_parameters, xt, yt)\n",
        "model_parameters -= learning_rate * grads\n"
      ],
      "metadata": {
        "id": "4tUfYJ6z-JDM"
      },
      "execution_count": 16,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "loss"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "uOnyuOrq_huU",
        "outputId": "0e1a4830-9639-49b7-f1c4-070ed4c4f4d7"
      },
      "execution_count": 17,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Array(6793.313, dtype=float32)"
            ]
          },
          "metadata": {},
          "execution_count": 17
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "preds.shape"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "lSE9nhJ__iz_",
        "outputId": "844ed9bd-e5c6-4109-e542-e80d2a7cc00a"
      },
      "execution_count": 18,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(1000,)"
            ]
          },
          "metadata": {},
          "execution_count": 18
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "grads"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "gJONT9X2_jtR",
        "outputId": "0fee6821-30dc-44bc-8434-c615c6e57047"
      },
      "execution_count": 19,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Array([-2533.0576 ,  -153.29868], dtype=float32)"
            ]
          },
          "metadata": {},
          "execution_count": 19
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Stopping gradient flow"
      ],
      "metadata": {
        "id": "AkMizZwdXwwi"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def f(x, y):\n",
        "  return x**2 + jax.lax.stop_gradient(y**2)\n",
        ""
      ],
      "metadata": {
        "id": "X0p_s2h_Xyzj"
      },
      "execution_count": 20,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def f(x, y):\n",
        "  return x**2 + y**2"
      ],
      "metadata": {
        "id": "r1XR_DX5cMc7"
      },
      "execution_count": 21,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "jax.grad(f, argnums=(0,1))(1.0, 1.0)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "rMrxy-N_bZ0w",
        "outputId": "890095e2-b383-4ffe-dc3b-193d675fd155"
      },
      "execution_count": 22,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(Array(2., dtype=float32, weak_type=True),\n",
              " Array(2., dtype=float32, weak_type=True))"
            ]
          },
          "metadata": {},
          "execution_count": 22
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Higher-order derivatives"
      ],
      "metadata": {
        "id": "LTzq3EMO_3Qt"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def f(x):\n",
        "    return x**4 + 12*x + 1/x\n",
        "\n",
        "f_d1 = jax.grad(f)\n",
        "f_d2 = jax.grad(f_d1)\n",
        "f_d3 = jax.grad(f_d2)\n",
        "\n",
        "x = 11.0\n",
        "\n",
        "print(f_d1(x))\n",
        "print(f_d2(x))\n",
        "print(f_d3(x))\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "0WQ2yIUN_kS3",
        "outputId": "f35abc0f-dc6f-4c9a-d4f6-266724a10f1d"
      },
      "execution_count": 23,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "5335.9917\n",
            "1452.0015\n",
            "263.9996\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "f_d3 = jax.grad(jax.grad(jax.grad(f)))\n",
        "\n",
        "print(f_d3(x))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "_J9xXyvR__me",
        "outputId": "eb56abb7-3de3-4dce-8a69-a8d94da3edcb"
      },
      "execution_count": 24,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "263.9996\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Displaying several derivatives:"
      ],
      "metadata": {
        "id": "TEtuJEX1LMiK"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def f(x):\n",
        "    return x**3 + 12*x + 7*x*jnp.sin(x)\n",
        "\n",
        "x = np.linspace(-10, 10, num=500)\n",
        "\n",
        "fig, ax = plt.subplots(figsize=(10,10))\n",
        "ax.plot(x, f(x), label = r\"$y = x^3 + 12x + 7x*sin(x)$\")\n",
        "\n",
        "df = f\n",
        "for d in range(1,4):\n",
        "  df = jax.grad(df)\n",
        "  #ax.plot(x, (df)(x), label=f'#{d} derivative')\n",
        "  ax.plot(x, jax.vmap(df)(x), label=f'#{d} derivative')\n",
        "  ax.legend()"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 830
        },
        "id": "5qa-jMcTLuXe",
        "outputId": "831b0249-17ae-4c49-bece-d7b16e0df480"
      },
      "execution_count": 25,
      "outputs": [
        {
          "output_type": "display_data",
          "data": {
            "text/plain": [
              "<Figure size 1000x1000 with 1 Axes>"
            ],
            "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1MAAAMtCAYAAAB6kCstAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAA9hAAAPYQGoP6dpAADWQ0lEQVR4nOzdd5hU5fnG8e+U7ZVdtrKNXmWpAipFQKqIigUlKpZojGiM0Viixp81scXEBEuCqBFiA2wUKUqvgkvvbWlbYHvfmTm/Pw4OrICwwHK23J/rmmuYmTNznlna3PO+7/PaDMMwEBERERERkWqxW12AiIiIiIhIXaQwJSIiIiIichYUpkRERERERM6CwpSIiIiIiMhZUJgSERERERE5CwpTIiIiIiIiZ0FhSkRERERE5Cw4rS6gNvB4PBw8eJCQkBBsNpvV5YiIiIiIiEUMw6CwsJD4+Hjs9l8ee1KYAg4ePEhiYqLVZYiIiIiISC2xb98+EhISfvEYhSkgJCQEMH9goaGhFlcjIiIiIiJWKSgoIDEx0ZsRfonCFHin9oWGhipMiYiIiIjIGS3/UQMKERERERGRs6AwJSIiIiIichYUpkRERERERM6C1kxVg9vtprKy0uoyROotX1/f07YgFREREaktFKbOgGEYZGRkkJeXZ3UpIvWa3W6nadOm+Pr6Wl2KiIiIyGkpTJ2Bn4JUdHQ0gYGB2thXpAb8tHn2oUOHSEpK0t8zERERqfUUpk7D7XZ7g1RkZKTV5YjUa1FRURw8eBCXy4WPj4/V5YiIiIj8Ii1OOI2f1kgFBgZaXIlI/ffT9D63221xJSIiIiKnpzB1hjTlSKTm6e+ZiIiI1CUKUyIiIiIiImdBYUpEREREROQsKEyJiIiIiIicBYUpqXF5eXl069aNTp060aFDB/79739bXZKIiIiIyDlTa3SpcSEhISxcuJDAwECKi4vp0KED1157rVrNi4iIiEidppEpqXEOh8PbWr68vBzDMDAMw+Kq5Hj33HMPY8aMqdZzjhw5QnR0NHv27Dmj40ePHs1rr712FtWJiIiI1E4KU3JB5OXlkZqaSkJCAo888giNGzc+r6+/cOFCRowYQXx8PDabjS+++KLK4y+99BLdu3cnJCSE6Ohorr76arZu3XpeazgTKSkp2Gy2Ey733XffOb1uv379zun5L730Eu+++261nvPCCy8wcuRIUlJSzuj4J598khdeeIH8/PyzqFBERESk9lGYkgsiPDyctWvXsnv3biZPnkxmZuZpn9OvXz/ef//9M3r94uJiUlNT+de//nXSxxcsWMB9993H8uXLmTNnDpWVlQwaNIji4uLqvI1zrnXVqlUcOnTIe5kzZw4A119/fbXPuWTJEubOnVvlvrlz57J06dJqv1ZERARBQUFnfHxJSQkTJkzgzjvvPOPndOjQgebNm/PRRx9Vuz4RERGR2khhqp5LSEhg/PjxVe5bunQpgYGB7N2797yc43//+x8BAQEcOnTIe9/tt99Ox44dTxiFiImJITU1lUWLFp2Xc/9k6NChPP/881xzzTUnfXzWrFmMHTuW9u3bk5qayvvvv096ejqrV68+q/dxtqKiooiNjfVevvnmG5o3b07fvn2rXUdSUhLvvPMOv/3tbyksLOS3v/0t7777LomJiSec1+Px8OKLL9KyZUv8/f2JiYlh7NixAOzZswebzeadrrdz505sNhvffPMNAwYMIDAwkNatW7NixQrv682YMQM/Pz969uxZrbpHjBjBxx9/fG4/RBEREZFaQmGqnuvRowerVq3y3jYMgwcffJDf//73JCcnVzn2xRdfJDg4+Bcv6enpJ5xj9OjRtGrVihdffBGAP//5z8ydO5eZM2cSFhZGZmYmhYWFAOTn57Nw4UJat25dg+/69H76cB8REeG973Tv43yrqKjgo48+4o477sBms1W7jsTERD777DPCwsJYs2YN4eHhfPrppycNUy+99BIff/wx7777Llu3bmXatGn06dMHgLVr1xIeHu6drrd27VpsNhuvv/46Tz31FGvXriUpKYnHHnvM+3qLFi2ia9euVc5xJnVffPHFrFy5kvLy8vPwExQRERGxlrr5nQXDMCitdFty7gAfR5UP3qfTs2dPPvjgA+/t//73v+zbt4/HH3/8hGN/85vfcMMNN/zi68XHx59wn81m44UXXuC6664jNjaWN998k0WLFtGkSRMA9u7dy9133+1tPHH//fdz0UUXnfF7ON88Hg8PPvggl156KR06dPDef7r3cb598cUX5OXleUeIqlvHgQMH+MMf/kCjRo3o0qULubm53iYPPz/222+/ZcSIEVx++eUAJCcnc8kllwCQlpZGx44dvcf+FK4++eQToqKiALjqqqt45513vMfs3bv3hD8LZ1J3fHw8FRUVZGRknBDmRUREROoahamzUFrppt3T31py7k3PDibQ98x/23r27Mljjz1GUVERNpuNJ554gueff57g4OATjo2IiKgyUlMdV155Je3atePZZ59l9uzZtG/f3vvYxRdfTFpa2mlf48UXX/SOagCUlpayfPlyxo0b571v06ZNJCUlnVWNP7nvvvvYsGEDixcvrtb7ON+1TpgwgaFDh540oJ5JHXv27OGuu+5i4MCB9OvXj7feeou5c+eyZ8+eE8LUVVddxaOPPsoPP/zA9ddfz6hRo2jUqBFghqdOnTp5j127di0jR470BimA3bt306JFiyrv19/fv9p1BwQEAOaaKxEREZG6TmGqnuvatSt2u501a9Ywd+5coqKiuP3220967M8DwsmcKiDMmjWLLVu24Ha7iYmJOatafz4yNmbMGEaNGsW1117rve9kwaM6xo0bxzfffMPChQtJSEg44fEzfR/nWuvevXuZO3cuU6dOPenjZ1LHpZdeesJ9AwcOPOmxDz/8MFdddRVffPEFf/vb37zBqmnTpqSlpXHllVd6j127du0JI5dpaWneaYEAjRs3Jjc3t9p15+TkAFQJaiIiIiJ1lcLUWQjwcbDp2cGWnbs6AgMDueiii5gyZQr//ve/mTFjBnb7yZfKne00vzVr1nDDDTcwYcIE3n//fZ566ik+++yzatUJJ46MBQQEEB0dXWVE5Gz9NL1w2rRpzJ8/n6ZNm55wTHXex7nWOnHiRKKjoxk+fPg51fGT+fPnn/acrVq14o9//CMPPPAAoaGhbNq0icjISPbs2eMdmcrPz2fPnj107ty5ynPT0tJ44IEHvLc7d+58Qle+M6l7w4YNJCQknPfW+CIiIiJWUJg6CzabrVpT7azWs2dP3nzzTUaOHPmL+xGdzTS/PXv2MHz4cJ544gluuukmmjVrRq9evVizZg1dunQ5x8rPXFFRETt27PDe3r17N2lpaURERJCUlMR9993H5MmT+fLLLwkJCSEjIwOAsLAwAgICLuj78Hg8TJw4kdtuuw2ns+qfo5qo4+WXXyY2Npbu3btjt9t55513iIyM5JJLLmHt2rU4HA7vdLx169bhdDqrrGnbu3cvubm5VaYCDh48mMcff5zc3FwaNWp0xnUvWrSIQYMGndX7EBEREal1DDHy8/MNwMjPzz/hsdLSUmPTpk1GaWmpBZWdH2+//bbh6+trbN++/by+7pEjR4zWrVsb99xzT5X7hw0bZgwePPicX79v377GxIkTz+jY77//3gBOuNx2222GYRgnfQwwJk6ceF7eR3Vq/fbbbw3A2Lp1a5X7a+rn+X//939Gq1atDH9/f6Nx48bGyJEjjU2bNhmGYRhvvvmm0aFDB++xb775ptG+ffsqz582bZoRHh5+wutefPHFxttvv33GdZeWlhphYWHGsmXLTllrffj7JiIiInXbL2WDn7MZhmFYEeJqk4KCAsLCwsjPzyc0NLTKY2VlZezevZumTZuedMF9XXD55ZfTpUsXXnvtNatLkXpk+vTpPPLII2zYsOGUU0eP99ZbbzFt2jRmz559ymPqw983ERERqdt+KRv8XN2ZqybV4vF4yM7OZsKECWzfvp0vv/zS6pKknhk+fDjbt2/nwIEDJ93b6ud8fHx48803L0BlIiIiIheGwlQ9tXDhQvr370+bNm2YMmXKaVO1yNl48MEHz/jYu+66q+YKEREREbGAwlQ91a9fPzwej9VliIiIiIjUW6df6CAiIiIiIiInUJgSERERERFLudx1c0aVwpSIiIiIiFjqr7O2cMM7y1i9N8fqUqpFa6ZERERERMQy+aWVTF6RTnGFm4JSl9XlVItGpkRERERExDKTVuyluMJN65gQ+rWOsrqcalGYEhERERERS5RVupm4ZA8Ad/dphs1ms7agalKYEhERERERS3zx4wGyC8uJC/NnRGq81eVUm8KUiIiIiIhccB6PwbsLdwFw52VN8XXWvWhS9yoWEREREZE6b87mTHYdLibE38noi5OsLuesKEyJiIiIiMgFZRgGby/YCcAtPZMJ9qubTcYVpuS869evHw8++OA5v87YsWO5+uqrz/l1Tuf9998nPDy8xs8jIiIiIqYf9ubyY3oevg47Yy9Nsbqcs6Yw1UBkZ2fj6+tLcXExlZWVBAUFkZ6eXuWYd999l379+hEaGorNZiMvL8+aYo/6+9//zvvvv39eXzMlJYU33nijyn033ngj27ZtO6/nEREREZFTe+foqNSork2IDvG3uJqzpzDVQCxbtozU1FSCgoJYs2YNERERJCVVnZtaUlLCkCFDeOKJJyyq0uR2u/F4PISFhV2QEaOAgACio6Nr/DwiIiIiAlsyCpi7OQubDe7q3czqcs6JwtTZMAyoKLbmYhhnVfLSpUu59NJLAVi8eLH318d78MEHeeyxx+jZs+cZv25xcTG33norwcHBxMXF8dprr51wTHl5OQ8//DBNmjQhKCiIHj16MH/+fO/jP02z++qrr2jXrh1+fn6kp6dXmeb37rvvEh8fj8fjqfLaI0eO5I477gBg586djBw5kpiYGIKDg+nevTtz5871HtuvXz/27t3L73//e2w2m3cfg+On+W3btg2bzcaWLVuqnOdvf/sbzZs3997esGEDQ4cOJTg4mJiYGG655RYOHz58xj83ERERkYbqX9+bo1LDOsTRPCrY4mrOTd1c6WW1yhJ40aI++E8cBN+gMzo0PT2djh07Auaok8Ph4P3336e0tBSbzUZ4eDg333wz48ePP+tyHnnkERYsWMCXX35JdHQ0TzzxBGvWrKFTp07eY8aNG8emTZv4+OOPiY+PZ9q0aQwZMoT169fTsmVLb31//etf+c9//kNkZOQJI0XXX389999/P99//z0DBgwAICcnh1mzZjFjxgwAioqKGDZsGC+88AJ+fn58+OGHjBgxgq1bt5KUlMTUqVNJTU3l7rvv5te//vVJ30+rVq3o1q0bkyZN4rnnnvPeP2nSJG6++WYA8vLy6N+/P3fddRd/+9vfKC0t5dFHH+WGG27gu+++O+ufpYiIiEh9t/twMdPXHQTgt5c3P83RtZ/CVD0WHx9PWloaBQUFdOvWjRUrVhAUFESnTp2YPn06SUlJBAef/bcBRUVFTJgwgY8++sgbcD744AMSEhK8x6SnpzNx4kTS09OJjzcD6MMPP8ysWbOYOHEiL774IgCVlZWMHz+e1NTUk56rUaNGDB06lMmTJ3vP9fnnn9O4cWMuv/xyAFJTU6s8/7nnnmPatGl89dVXjBs3joiICBwOByEhIcTGxp7yfY0ZM4Z//vOf3jC1bds2Vq9ezUcffQTAP//5Tzp37uytHeC9994jMTGRbdu20apVq+r9IEVEREQaiLfm78BjQP820bSPD7O6nHOmMHU2fALNESKrzn2GnE4nKSkpfPrpp3Tv3p2OHTuyZMkSYmJi6NOnzzmXsnPnTioqKujRo4f3voiICFq3bu29vX79etxu9wkBo7y8nMjISO9tX19f7yjaqYwZM4Zf//rXjB8/Hj8/PyZNmsTo0aOx283ZqkVFRTzzzDNMnz6dQ4cO4XK5KC0tPaHRxumMHj2ahx9+mOXLl9OzZ08mTZpEly5daNOmDQBr167l+++/P2kQ3blzp8KUiIiIyEnszy1h6poDANx3eQuLqzk/FKbOhs12xlPtrNS+fXv27t1LZWUlHo+H4OBgXC4XLpeL4OBgkpOT2bhxY43WUFRUhMPhYPXq1TgcjiqPHR9GAgICvGuYTmXEiBEYhsH06dPp3r07ixYt4m9/+5v38Ycffpg5c+bw6quv0qJFCwICArjuuuuoqKioVs2xsbH079+fyZMn07NnTyZPnsy9995b5T2NGDGCv/71ryc8Ny4urlrnEhEREWko3l24C5fH4JLmkXRNbmR1OeeFwlQ9NmPGDCorKxkwYAAvv/wyXbt2ZfTo0YwdO5YhQ4bg4+NzTq/fvHlzfHx8WLFihbczYG5uLtu2baNv374AdO7cGbfbTVZWFr179z6n8/n7+3PttdcyadIkduzYQevWrenSpYv38SVLljB27FiuueYawAw9e/bsqfIavr6+uN3u055rzJgx/PGPf+Smm25i165djB492vtYly5dmDJlCikpKTid+iskIiIicjpZBWV8vGofAOP6149RKVA3v3otOTmZ4OBgMjMzGTlyJImJiWzcuJFRo0bRokULkpOTqxyfkZFBWloaO3bsAMwpemlpaeTk5Jz09YODg7nzzjt55JFH+O6779iwYQNjx471TrsDs6HDmDFjuPXWW5k6dSq7d+9m5cqVvPTSS0yfPr3a72nMmDFMnz6d9957jzFjxlR5rGXLlkydOpW0tDTWrl3LzTfffEL3v5SUFBYuXMiBAwd+sfvetddeS2FhIffeey+XX365d70XwH333UdOTg433XQTq1atYufOnXz77bfcfvvtZxTURERERBqa/yzeTYXLQ5ekcHo1izz9E+oIhal6bv78+XTv3h1/f39WrlxJQkLCKaeivf3223Tu3Nnb6a5Pnz507tyZr7766pSv/8orr9C7d29GjBjBwIEDueyyy+jatWuVYyZOnMitt97KH/7wB1q3bs3VV1/NqlWrTtjn6kz079+fiIgItm7d6u2u95PXX3+dRo0acckllzBixAgGDx5cZeQK4Nlnn2XPnj00b96cqKioU54nJCSEESNGsHbt2hNCW3x8PEuWLMHtdjNo0CAuuugiHnzwQcLDw6sESRERERGB3OIKPlq+F4D7+7c87dKOusRmGGe5cVE9UlBQQFhYGPn5+YSGhlZ5rKysjN27d9O0aVP8/evu7swidYH+vomIiNQ/r8/eyj++20H7+FC+uf+yWh+mfikb/Jy+RhcRERERkRpRUFbJxKV7ALODX20PUtWlMCUiIiIiIjXiv8v2UljmokV0MEPan3qfz7pKYUpERERERM67onIX/160C4Df9muO3V6/RqWghsPUwoULGTFiBPHx8dhsNr744osqjxuGwdNPP01cXBwBAQEMHDiQ7du3VzkmJyeHMWPGEBoaSnh4OHfeeSdFRUVVjlm3bh29e/fG39+fxMREXn755Zp8WyIiIiIichofLN1DXkklzRoHcVVq/OmfUAfVaJgqLi4mNTWVf/3rXyd9/OWXX+Yf//gHb7/9NitWrCAoKIjBgwdTVlbmPWbMmDFs3LiROXPm8M0337Bw4ULuvvtu7+MFBQUMGjSI5ORkVq9ezSuvvMIzzzzDu+++W5NvTURERERETqGgrJJ3F5qjUg8MaInTUT8nxNXojqNDhw5l6NChJ33MMAzeeOMNnnzySUaOHAnAhx9+SExMDF988QWjR49m8+bNzJo1i1WrVtGtWzcA3nzzTYYNG8arr75KfHw8kyZNoqKigvfeew9fX1/at29PWloar7/+epXQJSIiIiIiF8b7S/aQX1pJ86ggRtTTUSmwcM3U7t27ycjIYODAgd77wsLC6NGjB8uWLQNg2bJlhIeHe4MUwMCBA7Hb7axYscJ7TJ8+ffD19fUeM3jwYLZu3Upubu5Jz11eXk5BQUGVi4iIiIiInLv80kr+s+jYqJSjHq6V+ollYSojIwOAmJiYKvfHxMR4H8vIyCA6OrrK406nk4iIiCrHnOw1jj/Hz7300kuEhYV5L4mJief+hkREREREhIlLdlNwtIPflR3r76gUNNBufo8//jj5+fney759+6wuSURERESkzssvrWTC4t0A/K6ej0qBhWEqNtbsM5+ZmVnl/szMTO9jsbGxZGVlVXnc5XKRk5NT5ZiTvcbx5/g5Pz8/QkNDq1zk/ElJSeGNN94459fp168fDz744Dm/zuk888wzdOrUqcbPIyIiIlLfTVi8m8IyF61ighl+UZzV5dQ4y8JU06ZNiY2NZd68ed77CgoKWLFiBb169QKgV69e5OXlsXr1au8x3333HR6Phx49eniPWbhwIZWVld5j5syZQ+vWrWnUqNEFeje1X3Z2Nr6+vhQXF1NZWUlQUBDp6enex3Nycrj//vtp3bo1AQEBJCUl8cADD5Cfn29ZzVOnTuW55547r695shb9Dz/8cJU/hyIiIiJSffkllUw8Oir14MBW9XJfqZ+r0TBVVFREWloaaWlpgNl0Ii0tjfT0dGw2Gw8++CDPP/88X331FevXr+fWW28lPj6eq6++GoC2bdsyZMgQfv3rX7Ny5UqWLFnCuHHjGD16NPHx5vzLm2++GV9fX+688042btzIJ598wt///nceeuihmnxrdc6yZctITU0lKCiINWvWEBERQVJSkvfxgwcPcvDgQV599VU2bNjA+++/z6xZs7jzzjsveK0VFRUAREREEBISUuPnCw4OJjIyssbPIyIiIlKf/WfxLgrLXbSJDWFI+5PPEKtvajRM/fDDD3Tu3JnOnTsD8NBDD9G5c2eefvppAP74xz9y//33c/fdd9O9e3eKioqYNWsW/v7+3teYNGkSbdq0YcCAAQwbNozLLrusyh5SYWFhzJ49m927d9O1a1f+8Ic/8PTTT9doW3TDMCipLLHkYhjGWdW8dOlSLr30UgAWL17s/fVPOnTowJQpUxgxYgTNmzenf//+vPDCC3z99de4XK5Tvm5WVhYjRowgICCApk2bMmnSpBOOycvL46677iIqKorQ0FD69+/P2rVrvY//NM3uP//5D02bNvX+/h8/ze+JJ57wjkYeLzU1lWeffRaAVatWccUVV9C4cWPCwsLo27cva9as8R6bkpICwDXXXIPNZvPePn6a3+zZs/H39ycvL6/KeX73u9/Rv39/7+3FixfTu3dvAgICSExM5IEHHqC4uPiUPycRERGR+iy3uIKJS/YA8ODAlg1iVApqeJ+pfv36/eKHf5vNxrPPPuv9MHwyERERTJ48+RfP07FjRxYtWnTWdVZXqauUHpNP/GB/Iay4eQWBPoFndGx6ejodO3YEoKSkBIfDwfvvv09paSk2m43w8HBuvvlmxo8ff9Ln5+fnExoaitN56j8mY8eO5eDBg3z//ff4+PjwwAMPnLDO7frrrycgIICZM2cSFhbGO++8w4ABA9i2bRsREREA7NixgylTpjB16lQcDscJ5xkzZgwvvfQSO3fupHnz5gBs3LiRdevWMWXKFAAKCwu57bbbePPNNzEMg9dee41hw4axfft2QkJCWLVqFdHR0UycOJEhQ4ac9DwDBgwgPDycKVOmeEfl3G43n3zyCS+88AIAO3fuZMiQITz//PO89957ZGdnM27cOMaNG8fEiRN/8fdEREREpD56e+FOispdtI0LZVC7hjEqBTUcpsRa8fHxpKWlUVBQQLdu3VixYgVBQUF06tSJ6dOnk5SURHBw8Emfe/jwYZ577rlfHOHbtm0bM2fOZOXKlXTv3h2ACRMm0LZtW+8xixcvZuXKlWRlZeHn5wfAq6++yhdffMHnn3/uff2Kigo+/PBDoqKiTnqu9u3bk5qayuTJk3nqqacAc9SyR48etGjRAqDKyBHAu+++S3h4OAsWLODKK6/0vnZ4ePgpm5M4HA5Gjx7N5MmTvWFq3rx55OXlMWrUKMBsrT9mzBjvqFnLli35xz/+Qd++fXnrrbeqjKyKiIiI1HeZBWW8f3RU6uFBDWOt1E8Ups5CgDOAFTevsOzcZ8rpdJKSksKnn35K9+7d6dixI0uWLCEmJoY+ffqc8nkFBQUMHz6cdu3a8cwzz5zyuM2bN+N0Ounatav3vjZt2hAeHu69vXbtWoqKik5Yk1RaWsrOnTu9t5OTk08ZpH4yZswY3nvvPZ566ikMw+B///tflbVxmZmZPPnkk8yfP5+srCzcbjclJSVVGm2ciTFjxtCzZ08OHjxIfHw8kyZNYvjw4d73tXbtWtatW1dlSqNhGHg8Hnbv3l0lTIqIiIjUd/+Yt51yl4euyY3o3yb69E+oRxSmzoLNZjvjqXZWat++PXv37qWyshKPx0NwcDAulwuXy0VwcDDJycls3LixynMKCwsZMmQIISEhTJs2DR8fn3OqoaioiLi4OObPn3/CY8eHrqCgoNO+1k033cSjjz7KmjVrKC0tZd++fdx4443ex2+77TaOHDnC3//+d5KTk/Hz86NXr17ehhZnqnv37jRv3pyPP/6Ye++9l2nTpvH+++9XeU/33HMPDzzwwAnPPb6ph4iIiEh9t/dIMZ+sMvds/ePg1thsDWdUChSm6rUZM2ZQWVnJgAEDePnll+natSujR49m7NixDBky5ISgVFBQwODBg/Hz8+Orr7467XS1Nm3a4HK5WL16tXea39atW6s0b+jSpQsZGRneUbJzkZCQQN++fZk0aRKlpaVcccUVREcf+/ZjyZIljB8/nmHDhgGwb98+Dh8+XOU1fHx8cLvdpz3XmDFjmDRpEgkJCdjtdoYPH17lPW3atMk7vVBERESkofrbnG24PAZ9WkXRo1nD645s2T5TUvOSk5MJDg4mMzOTkSNHkpiYyMaNGxk1ahQtWrQgOTnZe2xBQQGDBg2iuLiYCRMmUFBQQEZGBhkZGacMH61bt2bIkCHcc889rFixgtWrV3PXXXcREHBsKuLAgQPp1asXV199NbNnz2bPnj0sXbqUP/3pT/zwww/Vfk9jxozh448/5rPPPmPMmDFVHmvZsiX//e9/2bx5MytWrGDMmDFVagGzo9+8efPIyMggNzf3F8+zZs0aXnjhBa677jrvei+ARx99lKVLlzJu3DjS0tLYvn07X375JePGjav2+xERERGpq7ZkFPDl2oOAOSrVEClM1XPz58+ne/fu+Pv7s3LlShISEoiLO3E36jVr1rBixQrWr19PixYtiIuL81727dt3ytefOHEi8fHx9O3bl2uvvZa77767ymiRzWZjxowZ9OnTh9tvv51WrVoxevRo9u7dS0xMTLXfz3XXXceRI0coKSnx7kf2kwkTJpCbm0uXLl245ZZbeOCBB6rUAvDaa68xZ84cEhMTvS37T6ZFixZcfPHFrFu37oTQ1rFjRxYsWMC2bdvo3bu3t93/T3ufiYiIiDQEr367FcOA4RfF0aFJmNXlWMJmnO3GRfVIQUEBYWFh3lbgxysrK2P37t1V9j8SkZqhv28iIiJ1w+q9OYx6axl2G8x5qC/No07eIbou+qVs8HMamRIRERERkTNmGAYvz9oKwHVdE+pVkKouhSkRERERETljC7cfZsXuHHwddn43sJXV5VhKYUpERERERM6IYRi88u0WAH7VM5km4We+B2p9pDAlIiIiIiJnZOaGDDYcKCDI18F9lze3uhzLKUyJiIiIiMhpudweXp1trpW6s3czIoP9TvOM+k9hSkRERERETmvKmv3syi4mPNCHu3o3tbqcWkFhSkREREREflFphZvX52wD4L5+LQj197G4otpBYUpERERERH7Re0t2k1lQTpPwAG69JNnqcmoNhSkRERERETmlI0XlvDV/JwCPDG6Nn9NhcUW1h8KUnHcpKSm88cYb5/w6/fr148EHHzzn1zmdZ555hk6dOtX4eURERETqoje/20FRuYv28aFclRpvdTm1isJUA5GdnY2vry/FxcVUVlYSFBREenp6lWPuuecemjdvTkBAAFFRUYwcOZItW7ZYVDFMnTqV55577ry+ps1m44svvqhy38MPP8y8efPO63lERERE6oM9h4v5aPleAJ4Y1ha73WZxRbWLwlQDsWzZMlJTUwkKCmLNmjVERESQlJRU5ZiuXbsyceJENm/ezLfffothGAwaNAi3231Ba62oqAAgIiKCkJCQGj9fcHAwkZGRNX4eERERkbrmldlbcXkM+raK4tIWja0up9ZRmDoLhmHgKSmx5GIYxlnVvHTpUi699FIAFi9e7P318e6++2769OlDSkoKXbp04fnnn2ffvn3s2bPnlK+blZXFiBEjCAgIoGnTpkyaNOmEY/Ly8rjrrruIiooiNDSU/v37s3btWu/jP02z+89//kPTpk3x9/cHqk7ze+KJJ+jRo8cJr52amsqzzz4LwKpVq7jiiito3LgxYWFh9O3blzVr1niPTUlJAeCaa67BZrN5bx8/zW/27Nn4+/uTl5dX5Ty/+93v6N+/v/f24sWL6d27NwEBASQmJvLAAw9QXFx8yp+TiIiISF2Tti+P6esOYbPBY0PbWF1OreS0uoC6yCgtZWuXrpacu/Wa1dgCA8/o2PT0dDp27AhASUkJDoeD999/n9LSUmw2G+Hh4dx8882MHz/+hOcWFxczceJEmjZtSmJi4inPMXbsWA4ePMj333+Pj48PDzzwAFlZWVWOuf766wkICGDmzJmEhYXxzjvvMGDAALZt20ZERAQAO3bsYMqUKUydOhWH48RFjWPGjOGll15i586dNG9u7ra9ceNG1q1bx5QpUwAoLCzktttu480338QwDF577TWGDRvG9u3bCQkJYdWqVURHRzNx4kSGDBly0vMMGDCA8PBwpkyZwp133gmA2+3mk08+4YUXXgBg586dDBkyhOeff5733nuP7Oxsxo0bx7hx45g4ceJpf19EREREajvDMHhpxmYAru2cQNu4UIsrqp0Upuqx+Ph40tLSKCgooFu3bqxYsYKgoCA6derE9OnTSUpKIjg4uMpzxo8fzx//+EeKi4tp3bo1c+bMwdfX96Svv23bNmbOnMnKlSvp3r07ABMmTKBt27beYxYvXszKlSvJysrCz8/cJfvVV1/liy++4PPPP+fuu+8GzKl9H374IVFRUSc9V/v27UlNTWXy5Mk89dRTAEyaNIkePXrQokULgCojRwDvvvsu4eHhLFiwgCuvvNL7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mWew2WxVLm3atPE+XlZWxn333UdkZCTBwcGMGjWKzMzMKq+Rnp7O8OHDCQwMJDo6mkceeQSXy3Wh34qIiIiI1EHjv99BXkklLaODua5rgtXlSB1SK2J3+/btmTt3rve203msrN///vdMnz6dzz77jLCwMMaNG8e1117LkiVLAHC73QwfPpzY2FiWLl3KoUOHuPXWW/Hx8eHFF1+84O9FREREROqO/bklTFy6B4DHh7XB6bB8rEHqkFoRppxOJ7GxsSfcn5+fz4QJE5g8eTL9+/cHYOLEibRt25bly5fTs2dPZs+ezaZNm5g7dy4xMTF06tSJ5557jkcffZRnnnkGX1/fC/12RERERKSOeG32NipcHno1i+Ty1tFWlyN1TK2I3tu3byc+Pp5mzZoxZswY0tPTAVi9ejWVlZUMHDjQe2ybNm1ISkpi2bJlACxbtoyLLrqImJgY7zGDBw+moKCAjRs3nvR85eXlFBQUVLmIiIiISMOy4UA+0348AMATw9pis9ksrkjqGsvDVI8ePXj//feZNWsWb731Frt376Z3794UFhaSkZGBr68v4eHhVZ4TExNDRkYGABkZGVWC1E+P//TYybz00kuEhYV5L4mJief/jYmIiIhIrWUYBi8e3aD36k7xXJQQZnFFUhdZPs1v6NCh3l937NiRHj16kJyczKeffkpAQECNnPPxxx/noYce8t4uKChQoBIRERFpQOZvzWbpziP4Ouw8PLi11eVIHWX5yNTPhYeH06pVK3bs2EFsbCwVFRXk5eVVOSYzM9O7xio2NvaE7n4/3T7ZOiwAPz8/QkNDq1xEREREpGFwuT28NNMclRp7aQoJjQItrkjqqloXpoqKiti5cydxcXF07doVHx8f5s2b531869atpKen06tXLwB69erF+vXrycrK8h4zZ84cQkNDadeu3QWvX0RERERqt09/2M+2zCLCAny4r18Lq8uROszyaX4PP/wwI0aMIDk5mYMHD/LnP/8Zh8PBTTfdRFhYGHfeeScPPfQQERERhIaGcv/999OrVy969uwJwKBBg2jXrh233HILL7/8MhkZGTz55JPcd999+Pn5WfzuRERERKQ2KSyr5PU5WwF4cGBLwgJ9LK5I6jLLw9T+/fu56aabOHLkCFFRUVx22WUsX76cqKgoAP72t79ht9sZNWoU5eXlDB48mPHjx3uf73A4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/vnnde655+ree++VJD322GOaN2+eXnrpJf3tb3/rtNcB//HYRxtUVuvUwOQI/eLM/maXAwAAgC7K9JapJ598UvHx8Ro5cqSefvppud1u32NLlizRxIkTZbfbffdNnTpVmzdv1sGDB33bTJ48ucVzTp06VUuWLDnqz2xsbFRVVVWLG7qGhZtL9N81+2SxSH+4dJjsQaaf4gAAAOiiTG2Zuv322zVq1CjFxcVp8eLFeuCBB1RYWKhnn31WklRUVKQ+ffq02Cc5Odn3WGxsrIqKinz3fXeboqKio/7cJ554Qo888kg7vxqYrbbRrV+/29S986fj+2hkRqzJFQEAAKAra/eP7e+///7DJpX4/m3Tpk2SpLvvvltnnnmmhg0bpptvvll//OMf9eKLL6qxsbG9y2rhgQceUGVlpe+2Z8+eDv156BzPL9iqfRX1SosN1f9MHWh2OQAAAOji2r1l6p577tFPfvKTY27Tt++Rp6keN26c3G63du3apczMTKWkpKi4uLjFNs3fN4+zOto2RxuHJUkhISEKCQk53ktBANlSXK2Xv9kpSXrsoiEKs5s+HBAAAABdXLtfcSYmJioxMbFN++bm5spqtSopKUmSlJOTo1//+tdyuVwKDg6WJM2bN0+ZmZmKjY31bbNgwQLdeeedvueZN2+ecnJyTu6FIGA0rynl9hqakp2sSVlJZpcEAACAbsC00flLlizRn/70J61du1Y7duzQa6+9prvuukvXXHONLyhdddVVstvtuv7665Wfn6/Zs2fr+eef19133+17njvuuEOffvqp/vjHP2rTpk16+OGHtXLlSt16661mvTR0svdy92n5znI5gq168IJss8sBAABAN2FaX6iQkBC98cYbevjhh9XY2Kg+ffrorrvuahGUoqOjNXfuXM2YMUOjR49WQkKCHnzwQd+06JI0fvx4/ec//9FvfvMb/epXv9KAAQP03nvvaciQIWa8LHSyynqXHp/TNAbvtrMGKC02zOSKAAAA0F1YDMMwzC7CbFVVVYqOjlZlZaWioqLMLget8PAH+Zq1eJf6Jobr0zsmMhU6AAAATkprsgFXnghY+fsr9X9LdklqmnSCIAUAAIDOxNUnApJhGHrkgw3yGtIPhvXQaf0TzC4JAAAA3QxhCgHp07wiLd/VNOnEr84fZHY5AAAA6IYIUwg4jW6Pfv/JRknSjRP7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99dNmzYdcZ+jvR9znh6b1+vVnXfeqdNOO01Dhgw56naZmZl6+eWXNWzYMFVWVuqZZ57R+PHjlZ+ff9z36e5m3LhxmjVrljIzM1VYWKhHHnlEEyZMUF5eniIjIw/bnnO37d577z1VVFToJz/5yVG34dxtu+ZzsDXnZ1vevzsLYaqd3H///frDH/5wzG02btx43MGiODFtOd579+7VZ599pjfffPO4z//dsWZDhw5Vjx49dPbZZ2v79u3q169f2wsPIK05xnfffbfvvmHDhslut+umm27SE088oZCQkI4uNSC15Rzet2+fzj33XF122WW64YYbjrkv5zDMNGPGDOXl5R1zTI8k5eTkKCcnx/f9+PHjNWjQIP3973/XY4891tFlBpTzzjvP9+9hw4Zp3Lhx6tWrl958801df/31JlbW9fzrX//Seeedp9TU1KNuw7mLZoSpdnLPPfcc8xMMSerbt+8JPVdKSsphs5M0z3KWkpJy1H2+PwDP7XarvLz8qPsEsrYc75kzZyo+Pl4XXnhhq3/euHHjJDW1CnSXC9GTOafHjRsnt9utXbt2KTMz87DHU1JS5HQ6VVFR0aJ1qri4uEuer0fS2uO7f/9+TZo0SePHj9c//vGPVv+87ngOf19CQoJsNtths0Ye67xLSUlp1faQbr31Vt8kSK39hD44OFgjR47Utm3bOqi6riMmJkYDBw486rHi3G2b3bt3a/78+a1uxefcPXHN52BxcbF69Ojhu7+4uFgjRow44j5tef/uLISpdpKYmKjExMR2ea6cnBw9/vjjKikp8XXdmzdvnqKiopSdnX3UfSoqKrRq1SqNHj1akvT555/L6/X6LqK6ktYeb8MwNHPmTP34xz9WcHBwq39ebm6uJLX4pe/qTuaczs3NldVqPazrabPRo0crODhYCxYs0KWXXipJ2rx5swoKClp80teVteb47tu3T5MmTdLo0aM1c+ZMWa2tH+7aHc/h77Pb7Ro9erQWLFig6dOnS2rqjrZgwQLdeuutR9wnJydHCxYs0J133um7b968ed3mPG0NwzB022236d1339XChQvVp0+fVj+Hx+PR+vXrdf7553dAhV1LTU2Ntm/frmuvvfaIj3Puts3MmTOVlJSkadOmtWo/zt0T16dPH6WkpGjBggW+8FRVVaVly5Yddabrtrx/dxpTp7/opnbv3m2sWbPGeOSRR4yIiAhjzZo1xpo1a4zq6mrDMAzD7XYbQ4YMMaZMmWLk5uYan376qZGYmGg88MADvudYtmyZkZmZaezdu9d337nnnmuMHDnSWLZsmfHNN98YAwYMMK688spOf33+aP78+YYkY+PGjYc9tnfvXiMzM9NYtmyZYRiGsW3bNuPRRx81Vq5caezcudN4//33jb59+xoTJ07s7LIDwuLFi43nnnvOyM3NNbZv3268+uqrRmJiovHjH//Yt833j7FhGMbNN99sZGRkGJ9//rmxcuVKIycnx8jJyTHjJfi1vXv3Gv379zfOPvtsY+/evUZhYaHv9t1tOIdPzBtvvGGEhIQYs2bNMjZs2GDceOONRkxMjG/21Guvvda4//77fdsvWrTICAoKMp555hlj48aNxkMPPWQEBwcb69evN+sl+K1bbrnFiI6ONhYuXNjiPK2rq/Nt8/3j+8gjjxifffaZsX37dmPVqlXGFVdcYTgcDiM/P9+Ml+DX7rnnHmPhwoXGzp07jUWLFhmTJ082EhISjJKSEsMwOHfbg8fjMTIyMoz77rvvsMc4d1unurrad30ryXj22WeNNWvWGLt37zYMwzCefPJJIyYmxnj//feNdevWGRdddJHRp08fo76+3vccZ511lvHiiy/6vj/e+7dZCFMmuO666wxJh92++OIL3za7du0yzjvvPCM0NNRISEgw7rnnHsPlcvke/+KLLwxJxs6dO333lZWVGVdeeaURERFhREVFGT/96U99Aa27u/LKK43x48cf8bGdO3e2OP4FBQXGxIkTjbi4OCMkJMTo37+/ce+99xqVlZWdWHHgWLVqlTFu3DgjOjracDgcxqBBg4zf//73RkNDg2+b7x9jwzCM+vp64xe/+IURGxtrhIWFGRdffHGLgIAmM2fOPOL7xXc/C+Mcbp0XX3zRyMjIMOx2uzF27Fhj6dKlvsfOOOMM47rrrmux/ZtvvmkMHDjQsNvtxuDBg405c+Z0csWB4Wjn6cyZM33bfP/43nnnnb7/i+TkZOP88883Vq9e3fnFB4DLL7/c6NGjh2G3242ePXsal19+ubFt2zbf45y7J++zzz4zJBmbN28+7DHO3dZpvk79/q35GHq9XuO3v/2tkZycbISEhBhnn332Yce9V69exkMPPdTivmO9f5vFYhiG0SlNYAAAAADQhbDOFAAAAAC0AWEKAAAAANqAMAUAAAAAbUCYAgAAAIA2IEwBAAAAQBsQpgAAAACgDQhTAAAAANAGhCkAAAAAaAPCFAAAAAC0AWEKAAAAANqAMAUAAAAAbfD/45lqczqmbM4AAAAASUVORK5CYII=\n"
          },
          "metadata": {}
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Jacobians"
      ],
      "metadata": {
        "id": "bBfuOkmQjunq"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def f(x):\n",
        "  return [\n",
        "      x[0]**2 + x[1]**2 - x[1]*x[2],\n",
        "      x[0]**2 - x[1]**2 + 3*x[0]*x[2]\n",
        "  ]"
      ],
      "metadata": {
        "id": "CeBNWRtCogD8"
      },
      "execution_count": 26,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "print(jax.jacrev(f)(jnp.array([3.0, 4.0, 5.0])))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "0T_xB5L0pXo6",
        "outputId": "13cab8c6-97de-49fa-cc76-24c28c0bc607"
      },
      "execution_count": 27,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[Array([ 6.,  3., -4.], dtype=float32), Array([21., -8.,  9.], dtype=float32)]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "print(jax.jacfwd(f)(jnp.array([3.0, 4.0, 5.0])))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "-_FVRvIUpbGu",
        "outputId": "e829878d-85e3-498a-eb61-2227442c8236"
      },
      "execution_count": 29,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "[Array([ 6.,  3., -4.], dtype=float32), Array([21., -8.,  9.], dtype=float32)]\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "%timeit -n 100 jax.jacrev(f)(jnp.array([3.0, 4.0, 5.0]))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Ioh2KzHZsXW1",
        "outputId": "ed3c5392-4f26-47d7-a69a-6e5a54042d77"
      },
      "execution_count": 30,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "33.4 ms ± 3.32 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "%timeit -n 100 jax.jacfwd(f)(jnp.array([3.0, 4.0, 5.0]))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "eHsTWT_IspdL",
        "outputId": "d1c8258d-b340-445a-cb7b-8e454fb2756e"
      },
      "execution_count": 31,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "21.6 ms ± 2.17 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)\n"
          ]
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Hessian"
      ],
      "metadata": {
        "id": "sb6bSzWtykRc"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def f(x):\n",
        "  return x[0]**2 - x[1]**2 + 3*x[0]*x[2]"
      ],
      "metadata": {
        "id": "Q9tvKi7wvZpe"
      },
      "execution_count": 32,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "jax.hessian(f)(jnp.array([3.0, 4.0, 5.0]))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "EdgLzQD-zIGq",
        "outputId": "66c38342-afc0-4359-8d4b-20cde0f6bf5d"
      },
      "execution_count": 33,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Array([[ 2.,  0.,  3.],\n",
              "       [ 0., -2.,  0.],\n",
              "       [ 3.,  0.,  0.]], dtype=float32)"
            ]
          },
          "metadata": {},
          "execution_count": 33
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "jax.jacfwd(jax.grad(f))(jnp.array([3.0, 4.0, 5.0]))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "jfdaGk3dzNws",
        "outputId": "c1a28f8a-8459-455d-de8c-c76c7b64dac6"
      },
      "execution_count": 34,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Array([[ 2.,  0.,  3.],\n",
              "       [ 0., -2.,  0.],\n",
              "       [ 3.,  0.,  0.]], dtype=float32)"
            ]
          },
          "metadata": {},
          "execution_count": 34
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "jax.jacfwd(jax.jacrev(f))(jnp.array([3.0, 4.0, 5.0]))"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "g8XNX0j60wE7",
        "outputId": "7522ac5a-4139-4370-e9b3-77d32cc3d8b4"
      },
      "execution_count": 36,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Array([[ 2.,  0.,  3.],\n",
              "       [ 0., -2.,  0.],\n",
              "       [ 3.,  0.,  0.]], dtype=float32)"
            ]
          },
          "metadata": {},
          "execution_count": 36
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# JVP"
      ],
      "metadata": {
        "id": "-iSR6E4VMhyA"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "Code for checking manual computations"
      ],
      "metadata": {
        "id": "hFWQ_DMREUwZ"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def f(x1,x2):\n",
        "  return x1*x2 + jnp.sin(x1*x2)"
      ],
      "metadata": {
        "id": "ljLgxOoMEUNK"
      },
      "execution_count": 37,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "x = (7.0, 2.0)"
      ],
      "metadata": {
        "id": "4W3UCl6pKRJb"
      },
      "execution_count": 38,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "f(*x)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "bkwUlzg9Enrj",
        "outputId": "591d93c2-497c-429f-dc94-d2a73cee0a11"
      },
      "execution_count": 39,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Array(14.990607, dtype=float32, weak_type=True)"
            ]
          },
          "metadata": {},
          "execution_count": 39
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "jax.grad(f)(*x)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "WMq50nHyHDQU",
        "outputId": "c04c8341-cc71-4c1f-fa35-a103754b1071"
      },
      "execution_count": 42,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Array(2.2734745, dtype=float32, weak_type=True)"
            ]
          },
          "metadata": {},
          "execution_count": 42
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "jax.grad(f, argnums=(0,1))(*x)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "2r2YVkMuHIdI",
        "outputId": "852470a5-dd07-4e88-e9d4-20b96c8b1195"
      },
      "execution_count": 43,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(Array(2.2734745, dtype=float32, weak_type=True),\n",
              " Array(7.9571605, dtype=float32, weak_type=True))"
            ]
          },
          "metadata": {},
          "execution_count": 43
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "JVP example"
      ],
      "metadata": {
        "id": "EFzdtG0XEY2F"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def f2(x):\n",
        "  return [\n",
        "      x[0]**2 + x[1]**2 - x[1]*x[2],\n",
        "      x[0]**2 - x[1]**2 + 3*x[0]*x[2]\n",
        "  ]\n",
        "\n",
        "x = jnp.array([3.0, 4.0, 5.0])\n",
        "v = jnp.array([1.0, 1.0, 1.0])"
      ],
      "metadata": {
        "id": "-Zxx6pas1f-V"
      },
      "execution_count": 44,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "p,t = jax.jvp(f2, x, v)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 321
        },
        "id": "hLn7D5XlcCPJ",
        "outputId": "c9687f15-3653-4959-97fc-bfdb97225c46"
      },
      "execution_count": 45,
      "outputs": [
        {
          "output_type": "error",
          "ename": "TypeError",
          "evalue": "ignored",
          "traceback": [
            "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
            "\u001b[0;31mTypeError\u001b[0m                                 Traceback (most recent call last)",
            "\u001b[0;32m<ipython-input-45-562f2469f886>\u001b[0m in \u001b[0;36m<cell line: 1>\u001b[0;34m()\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mp\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mjax\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mjvp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mf2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mv\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m",
            "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/jax/_src/api.py\u001b[0m in \u001b[0;36mjvp\u001b[0;34m(fun, primals, tangents, has_aux)\u001b[0m\n\u001b[1;32m   1968\u001b[0m   \"\"\"\n\u001b[1;32m   1969\u001b[0m   \u001b[0mcheck_callable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1970\u001b[0;31m   \u001b[0;32mreturn\u001b[0m \u001b[0m_jvp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlu\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mwrap_init\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprimals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtangents\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhas_aux\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mhas_aux\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m   1971\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m   1972\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_jvp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfun\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mlu\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mWrappedFun\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mprimals\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mtangents\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mhas_aux\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mFalse\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;32m/usr/local/lib/python3.10/dist-packages/jax/_src/api.py\u001b[0m in \u001b[0;36m_jvp\u001b[0;34m(fun, primals, tangents, has_aux)\u001b[0m\n\u001b[1;32m   1974\u001b[0m   if (not isinstance(primals, (tuple, list)) or\n\u001b[1;32m   1975\u001b[0m       not isinstance(tangents, (tuple, list))):\n\u001b[0;32m-> 1976\u001b[0;31m     raise TypeError(\"primal and tangent arguments to jax.jvp must be tuples or lists; \"\n\u001b[0m\u001b[1;32m   1977\u001b[0m                     f\"found {type(primals).__name__} and {type(tangents).__name__}.\")\n\u001b[1;32m   1978\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
            "\u001b[0;31mTypeError\u001b[0m: primal and tangent arguments to jax.jvp must be tuples or lists; found ArrayImpl and ArrayImpl."
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "p,t = jax.jvp(f2, (x,), (v,))"
      ],
      "metadata": {
        "id": "nWdFiwOCPQxM"
      },
      "execution_count": 46,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "p"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Ru17K471PXeT",
        "outputId": "a2ffd1a5-710d-44e4-9dcd-c8b0b3de9241"
      },
      "execution_count": 47,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[Array(5., dtype=float32), Array(38., dtype=float32)]"
            ]
          },
          "metadata": {},
          "execution_count": 47
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "t"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "CxxtONHmRVJ9",
        "outputId": "8b1bdcd4-a28c-48d1-c901-70ce88e63de2"
      },
      "execution_count": 48,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[Array(5., dtype=float32), Array(22., dtype=float32)]"
            ]
          },
          "metadata": {},
          "execution_count": 48
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "p,t = jax.jvp(f2, (x,), (jnp.array([1.0, 0.0, 0.0]),))\n",
        "t"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Dl6TsTXLRbE_",
        "outputId": "6367fed5-1151-4b7c-a70c-642cf6f63a74"
      },
      "execution_count": 49,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[Array(6., dtype=float32), Array(21., dtype=float32)]"
            ]
          },
          "metadata": {},
          "execution_count": 49
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "p,t = jax.jvp(f2, (x,), (jnp.array([0.0, 1.0, 0.0]),))\n",
        "t"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "2jiVZ0FUVQs_",
        "outputId": "b83e95d3-edab-4ecb-faa5-93566b2a35d1"
      },
      "execution_count": 50,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[Array(3., dtype=float32), Array(-8., dtype=float32)]"
            ]
          },
          "metadata": {},
          "execution_count": 50
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "p,t = jax.jvp(f2, (x,), (jnp.array([0.0, 0.0, 1.0]),))\n",
        "t"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "koMKGSWRVlnk",
        "outputId": "4044869e-0152-44de-b96e-68257452b06d"
      },
      "execution_count": 51,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[Array(-4., dtype=float32), Array(9., dtype=float32)]"
            ]
          },
          "metadata": {},
          "execution_count": 51
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Checking manual computations with jvp()"
      ],
      "metadata": {
        "id": "4V1-MTDcW02R"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def f(x1,x2):\n",
        "  return x1*x2 + jnp.sin(x1*x2)\n",
        "\n",
        "x = (7.0, 2.0)\n",
        "\n",
        "p,t = jax.jvp(f, x, (1.0, 0.0))"
      ],
      "metadata": {
        "id": "0G-3yWHzW4L7"
      },
      "execution_count": 52,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "p"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "H2XC1YtUZF7P",
        "outputId": "980a77ca-dcc2-4f51-c7bc-434601d4f44e"
      },
      "execution_count": 53,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Array(14.990607, dtype=float32, weak_type=True)"
            ]
          },
          "metadata": {},
          "execution_count": 53
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "t"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "Uowcrn6qZIL_",
        "outputId": "37199954-ceb5-4d40-e5f8-5026395ed88c"
      },
      "execution_count": 54,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Array(2.2734745, dtype=float32, weak_type=True)"
            ]
          },
          "metadata": {},
          "execution_count": 54
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# VJP"
      ],
      "metadata": {
        "id": "ulC5nrNQVwFr"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def f(x1,x2):\n",
        "  return x1*x2 + jnp.sin(x1*x2)\n",
        "\n",
        "x = (7.0, 2.0)\n",
        "\n",
        "p,vjp_func = jax.vjp(f, *x)"
      ],
      "metadata": {
        "id": "YxaEy90hvGJ3"
      },
      "execution_count": 55,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "p"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "1doEbYw2vQNI",
        "outputId": "d955a900-1105-4327-9512-73ef0a4a94b6"
      },
      "execution_count": 56,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "Array(14.990607, dtype=float32, weak_type=True)"
            ]
          },
          "metadata": {},
          "execution_count": 56
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "vjp_func(1.0)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "eNIvJhrcw1vL",
        "outputId": "4cccf85e-edfc-45b7-d277-f3889ac7a326"
      },
      "execution_count": 57,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(Array(2.2734745, dtype=float32, weak_type=True),\n",
              " Array(7.9571605, dtype=float32, weak_type=True))"
            ]
          },
          "metadata": {},
          "execution_count": 57
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "vjp_func(2.0)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "pG7ivkazyde_",
        "outputId": "7681c21a-06f3-497b-d874-af96c2eb033f"
      },
      "execution_count": 58,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(Array(4.546949, dtype=float32, weak_type=True),\n",
              " Array(15.914321, dtype=float32, weak_type=True))"
            ]
          },
          "metadata": {},
          "execution_count": 58
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "More complicated function"
      ],
      "metadata": {
        "id": "tW_rmFUp0Lqr"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "def f2(x):\n",
        "  return [\n",
        "      x[0]**2 + x[1]**2 - x[1]*x[2],\n",
        "      x[0]**2 - x[1]**2 + 3*x[0]*x[2]\n",
        "  ]\n",
        "\n",
        "x = jnp.array([3.0, 4.0, 5.0])"
      ],
      "metadata": {
        "id": "3GyTfHX9Voik"
      },
      "execution_count": 59,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "p,vjp_func = jax.vjp(f2, x)"
      ],
      "metadata": {
        "id": "jtDjTacyYVhZ"
      },
      "execution_count": 60,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "p"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "SCF01wQNZDet",
        "outputId": "279f0d96-e1b7-4f97-80c3-8a277b813d11"
      },
      "execution_count": 61,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[Array(5., dtype=float32), Array(38., dtype=float32)]"
            ]
          },
          "metadata": {},
          "execution_count": 61
        }
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "Restoring rows of the Jacobian"
      ],
      "metadata": {
        "id": "qCbEZi-J2HGy"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "vjp_func([1.0, 0.0])"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "aP1TpR_jZJQw",
        "outputId": "6d7ac85e-81c8-4bef-bd16-bb1133e82ce9"
      },
      "execution_count": 62,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(Array([ 6.,  3., -4.], dtype=float32),)"
            ]
          },
          "metadata": {},
          "execution_count": 62
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "vjp_func([0.0, 1.0])"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "oMiX5_S_ZOBm",
        "outputId": "da96be21-d299-40ef-8826-af5ce2091537"
      },
      "execution_count": 63,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "(Array([21., -8.,  9.], dtype=float32),)"
            ]
          },
          "metadata": {},
          "execution_count": 63
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [],
      "metadata": {
        "id": "974Wws9Y0qRl"
      },
      "execution_count": null,
      "outputs": []
    }
  ]
}